// 引入express框架
const express = require("express");

// 创建网站服务器
const app = express();

// 引入路径操作模块
const path = require("path");

// os模块获取本服务器IP地址
const os = require("os");
function getLocalIpAddress() {
  const networkInterfaces = os.networkInterfaces();
  let ipAddress = "";
  for (const interfaceName in networkInterfaces) {
    for (const netInfo of networkInterfaces[interfaceName]) {
      if (netInfo.family === "IPv4" && !netInfo.internal) {
        ipAddress = netInfo.address;
        break;
      }
    }
    if (ipAddress) break;
  }
  return ipAddress || "IP address not found";
}

const hostname = getLocalIpAddress(); // 地址
const port = 3000; // 端口

require("./model/mongo"); // 连接mongoDB数据库文件

// 处理post请求参数
app.use(express.urlencoded({ extended: false }));
// json解析中间件
app.use(express.json());

// 开放静态资源文件访问
// `http://${hostname}:${port}/images/XXX.jpg`访问public目录下的资源文件
app.use(express.static(path.join(__dirname, "public")));

// 设置跨域访问
app.all("*", (req, response, next) => {
  // 设置允许跨域的域名，*代表允许任意域名跨域
  // response.header("Access-Control-Allow-Origin", "*");
  // console.log(req.headers.origin); // 前端项目开启的域名
  response.header("Access-Control-Allow-Origin", req.headers.origin);
  // Access-Control-Allow-Credentials 为 true 时必须指定一个确定的域名
  // cookie开放
  response.header("Access-Control-Allow-Credentials", "true");
  // 允许的header类型
  response.header("Access-Control-Allow-Headers", "X-Requested-With");
  // 跨域允许的请求方式
  response.header(
    "Access-Control-Allow-Methods",
    "PUT,POST,GET,DELETE,OPTIONS"
  );
  // 设置响应头信息
  response.header("X-Powered-By", "Express");
  // 设置指定响应头
  response.header("Content-Type", "application/json;charset=utf-8");
  // 让options请求快速返回
  if (req.method == "OPTIONS") {
    response.sendStatus(200);
  } else {
    next();
  }
});

app.use("/course", require("./route/course"));

// 检查token拦截中间件
app.use(require("./middleware/censorToken"));

// 导入匹配路由路径
app.use("/admin", require("./route/admin"));
app.use("/user", require("./route/user"));

// 监听端口
app.listen(port, (err) => {
  if (err) {
    console.log("服务端启动失败");
  }
  console.log(
    `node服务端运行在 http://${hostname}:${port}`
  );
});
